home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / documents / RFC / rfc1187.txt < prev    next >
Text File  |  1994-08-01  |  27KB  |  675 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7. Network Working Group                                            M. Rose
  8. Request for Comments: 1187       Performance Systems International, Inc.
  9.                                                            K. McCloghrie
  10.                                                       Hughes LAN Systems
  11.                                                                 J. Davin
  12.                                      MIT Laboratory for Computer Science
  13.                                                             October 1990
  14.  
  15.  
  16.                    Bulk Table Retrieval with the SNMP
  17.  
  18. 1.  Status of this Memo
  19.  
  20.    This memo reports an interesting family of algorithms for bulk table
  21.    retrieval using the Simple Network Management Protocol (SNMP).  This
  22.    memo describes an Experimental Protocol for the Internet community,
  23.    and requests discussion and suggestions for improvements.  This memo
  24.    does not specify a standard for the Internet community.  Please refer
  25.    to the current edition of the "IAB Official Protocol Standards" for
  26.    the standardization state and status of this protocol.  Distribution
  27.    of this memo is unlimited.
  28.  
  29. Table of Contents
  30.  
  31.    1. Status of this Memo ..................................    1
  32.    2. Abstract .............................................    1
  33.    3. Bulk Table Retrieval with the SNMP ...................    2
  34.    4. The Pipelined Algorithm ..............................    3
  35.    4.1 The Maximum Number of Active Threads ................    4
  36.    4.2 Retransmissions .....................................    4
  37.    4.3 Some Definitions ....................................    4
  38.    4.4 Top-Level ...........................................    5
  39.    4.5 Wait for Events .....................................    6
  40.    4.6 Finding the Median between two OIDs .................    8
  41.    4.7 Experience with the Pipelined Algorithm .............   10
  42.    4.8 Dynamic Range of Timeout Values .....................   10
  43.    4.9 Incorrect Agent Implementations .....................   10
  44.    5. The Parallel Algorithm ...............................   11
  45.    5.1 Experience with the Parallel Algorithm ..............   11
  46.    6. Acknowledgements .....................................   11
  47.    7. References ...........................................   12
  48.    Security Considerations..................................   12
  49.    Authors' Addresses.......................................   12
  50.  
  51. 2.  Abstract
  52.  
  53.    This memo reports an interesting family of algorithms for bulk table
  54.    retrieval using the Simple Network Management Protocol (RFC 1157) [1].
  55.  
  56.  
  57.  
  58. Rose, McCloghrie & Davin                                        [Page 1]
  59.  
  60. RFC 1187           Bulk Table Retrieval with the SNMP       October 1990
  61.  
  62.  
  63.    The reader is expected to be familiar with both the Simple Network
  64.    Management Protocol and SNMP's powerful get-next operator.  Please
  65.    send comments to: Marshall T. Rose <mrose@psi.com>.
  66.  
  67. 3.  Bulk Table Retrieval with the SNMP
  68.  
  69.    Empirical evidence has shown that SNMP's powerful get-next operator is
  70.    effective for table traversal, particularly when the management
  71.    station is interested in well-defined subsets of a particular table.
  72.    There has been some concern that bulk table retrieval can not be
  73.    efficiently accomplished using the powerful get-next operator.  Recent
  74.    experience suggests otherwise.
  75.  
  76.    In the simplest case, using the powerful get-next operator, one can
  77.    traverse an entire table by retrieving one object at a time.  For
  78.    example, to traverse the entire ipRoutingTable, the management station
  79.    starts with:
  80.  
  81.                   get-next (ipRouteDest)
  82.  
  83.    which might return
  84.  
  85.                   ipRouteDest.0.0.0.0
  86.  
  87.    The management station then continues invoking the powerful get-next
  88.    operator, using the value provided by the previous response, e.g.,
  89.  
  90.                   get-next (ipRouteDest.0.0.0.0)
  91.  
  92.    As this sequence continues, each column of the ipRoutingTable can be
  93.    retrieved, e.g.,
  94.  
  95.                   get-next (ipRouteDest.192.33.4.0)
  96.  
  97.    which might return
  98.  
  99.                   ipRouteIfIndex.0.0.0.0
  100.  
  101.    Eventually, a response is returned which is outside the table, e.g.,
  102.  
  103.                   get-next (ipRouteMask.192.33.4.0)
  104.  
  105.    which might return
  106.  
  107.                   ipNetToMediaIfIndex.192.33.4.1
  108.  
  109.    So, using this scheme, O(rows x columns) management operations are
  110.    required to retrieve the entire table.
  111.  
  112.  
  113.  
  114. Rose, McCloghrie & Davin                                        [Page 2]
  115.  
  116. RFC 1187           Bulk Table Retrieval with the SNMP       October 1990
  117.  
  118.  
  119.    This approach is obviously sub-optimal as the powerful get-next
  120.    operator can be given several operands.  Thus, the first step is to
  121.    retrieve an entire row of the table with each operation, e.g.,
  122.  
  123.               get-next (ipRouteDest, ipRouteIfIndex, ..., ipRouteMask)
  124.  
  125.    which might return
  126.  
  127.                   ipRouteDest.0.0.0.0
  128.                   ipRouteIfIndex.0.0.0.0
  129.                   ipRouteMask.0.0.0.0
  130.  
  131.    The management station can then continue invoking the powerful get-
  132.    next operator, using the results of the previous operation as the
  133.    operands to the next operation.  Using this scheme O(rows) management
  134.    operations are required to retrieve the entire table.
  135.  
  136.    Some have suggested that this is a weakness of the SNMP, in that
  137.    O(rows) serial operations is time-expensive.  The problem with such
  138.    arguments however is that implicit emphasis on the word "serial".  In
  139.    fact, there is nothing to prevent a clever management station from
  140.    invoking the powerful get-next operation several times, each with
  141.    different operands, in order to achieve parallelism and pipelining in
  142.    the network.  Note that this approach requires no changes in the
  143.    SNMP, nor does it add any significant burden to the agent.
  144.  
  145. 4.  The Pipelined Algorithm
  146.  
  147.    Let us now consider an algorithm for bulk table retrieval with the
  148.    SNMP.  In the interests of brevity, the "pipelined algorithm" will
  149.    retrieve only a single column from the table; without loss of
  150.    generality, the pipelined algorithm can be easily extended to
  151.    retrieve all columns.
  152.  
  153.    The algorithm operates by adopting a multi-threaded approach: each
  154.    thread generates its own stream of get-next requests and processes
  155.    the resulting stream of responses.  For a given thread, a request
  156.    will correspond to a different row in the table.
  157.  
  158.    Overall retrieval efficiency is improved by being able to keep
  159.    several transactions in transit, and by having the agent and
  160.    management station process transactions simultaneously.
  161.  
  162.    The algorithm will adapt itself to varying network conditions and
  163.    topologies as well as varying loads on the agent.  It does this both
  164.    by varying the number of threads that are active (i.e., the number of
  165.    transactions that are being processed and in transit) and by varying
  166.    the retransmission timeout.  These parameters are varied based on the
  167.  
  168.  
  169.  
  170. Rose, McCloghrie & Davin                                        [Page 3]
  171.  
  172. RFC 1187           Bulk Table Retrieval with the SNMP       October 1990
  173.  
  174.  
  175.    transaction round-trip-time and on the loss/timeout of transactions.
  176.  
  177. 4.1.  The Maximum Number of Active Threads
  178.  
  179.    One part of the pipelined algorithm which must be dynamic to get best
  180.    results is the determination of how many threads to have active at a
  181.    time.  With only one thread active, the pipelined algorithm
  182.    degenerates to the serial algorithm mentioned earlier.  With more
  183.    threads than necessary, there is a danger of overrunning the agent,
  184.    whose only recourse is to drop requests, which is wasteful.  The
  185.    ideal number is just enough to have the next request arrive at the
  186.    agent, just as it finishes processing the previous request.  This
  187.    obviously depends on the round-trip time, which not only varies
  188.    dynamically depending on network topology and traffic-load, but can
  189.    also be different for different tables in the same agent.
  190.  
  191.    With too few threads active, the round-trip time barely increases
  192.    with each increase in the number of active threads; with too many,
  193.    the round-trip time increases by the amount of time taken by the
  194.    agent to process one request.  The number is dynamically estimated by
  195.    calculating the round-trip-time divided by the number of active
  196.    threads; whenever this value takes on a new minimum value, the limit
  197.    on the number of threads is adjusted to be the number of threads
  198.    active at the time the corresponding request was sent (plus one to
  199.    allow for loss of requests).
  200.  
  201. 4.2.  Retransmissions
  202.  
  203.    When there are no gateways between the manager and agent, the
  204.    likelihood of in-order arrival of requests and responses is quite
  205.    high.  At present, the decision to retransmit is based solely on the
  206.    timeout.  One possible optimization is for the manager to remember
  207.    the order in which requests are sent, and correlate this to incoming
  208.    responses.  If one thread receives a response before another thread
  209.    which sent an earlier request, then lossage could be assumed, and a
  210.    retransmission made immediately.
  211.  
  212. 4.3.  Some Definitions
  213.  
  214.    To begin, let us define a "thread" as some state information kept in
  215.    the management station which corresponds to a portion of the table to
  216.    be retrieved.  A thread has several bits of information associated
  217.    with it:
  218.  
  219.       (1)  the range of SNMP request-ids which this thread can use,
  220.            along with the last request-id used;
  221.  
  222.       (2)  last SNMP message sent, the number of times it has been
  223.  
  224.  
  225.  
  226. Rose, McCloghrie & Davin                                        [Page 4]
  227.  
  228. RFC 1187           Bulk Table Retrieval with the SNMP       October 1990
  229.  
  230.  
  231.            (re)sent, the time it was (re)sent;
  232.  
  233.       (3)  the inclusive lower-bound and exclusive upper-bound of
  234.            the object-instance for the portion of the table that
  235.            this thread will retrieve, along with the current
  236.            object-instance being used;
  237.  
  238.       (4)  the number of threads which were active at the time it
  239.            was last sent;
  240.  
  241.    When a thread is created, it automatically sends a get-next message
  242.    using its inclusive lower-bound OID.  Further, it is placed at the
  243.    end of the "thread queue".
  244.  
  245.    Let us also define an OID as a concrete representation of an object
  246.    identifier which contains two parts:
  247.  
  248.       (1)  the number of sub-identifiers present, "nelem";
  249.  
  250.       (2)  the sub-identifiers themselves in an array, "elems",
  251.            indexed from 1 up to (and including) "nelem".
  252.  
  253. 4.4.  Top-Level
  254.  
  255.    The top-level consists of starting three threads, and then entering a
  256.    loop.  As long as there are existing threads, the top-level waits for
  257.    events (described next), and then acts upon the incoming messages.
  258.    For each thread which received a response, a check is made to see if
  259.    the OID of the response is greater than or equal to the exclusive
  260.    upper-bound of the thread.  If so, the portion of the table
  261.    corresponding to the thread has been completely retrieved, so the
  262.    thread is destroyed.
  263.  
  264.    Otherwise, the variable bindings in the response are stored.
  265.    Following this, if a new thread should be created, then the portion
  266.    of the table corresponding to the thread is split accordingly.
  267.    Regardless, another powerful get-next operator is issued on behalf of
  268.    the thread.
  269.  
  270.    The initial starting positions (column, column.127, and column.192),
  271.    were selected to form optimal partitions for tables which are indexed
  272.    by IP addresses.  The algorithm could easily be modified to choose
  273.    other partitions; however, it must be stressed that the current
  274.    choices work for any tabular object.
  275.  
  276.       pipelined_algorithm (column)
  277.       OID  column;
  278.       {
  279.  
  280.  
  281.  
  282. Rose, McCloghrie & Davin                                        [Page 5]
  283.  
  284. RFC 1187           Bulk Table Retrieval with the SNMP       October 1990
  285.  
  286.  
  287.           timeout ::= some initial value;
  288.  
  289.           start new thread for [column, column.127);
  290.           start new thread for [column.127, column.192);
  291.           start new thread for [column.192, column+1);
  292.  
  293.           while (threads exist) {
  294.              wait for events;
  295.              foreach (thread that has an incoming message,
  296.                       examined in order from the thread queue) {
  297.                  OID     a;
  298.  
  299.                  if (message's OID >= thread's upper-bound) {
  300.                      destroy thread;
  301.                      continue;
  302.                  }
  303.  
  304.                  store variable-bindings from message;
  305.  
  306.                  if (number of simultaneous threads does NOT
  307.                              exceed a maximum number
  308.                           && NOT backoff
  309.                           && (a ::= oid_median (message's OID,
  310.                                                 thread's
  311.                                                     upper-bound))) {
  312.                       start new thread for [a, thread's upper-bound);
  313.                       thread's upper-bound ::= a;
  314.                       place thread at end of thread queue;
  315.                       backoff ::= TRUE;
  316.                   }
  317.                   do another get-next for thread;
  318.               }
  319.           }
  320.       }
  321.  
  322.  
  323. 4.5.  Wait for Events
  324.  
  325.    Waiting for events consists of waiting a small amount of time or
  326.    until at least one message is received.
  327.  
  328.    Any messages encountered are then collated with the appropriate
  329.    thread.  In addition, the largest round-trip time for
  330.    request/responses is measured, and the maximum number of active
  331.    threads is calculated.
  332.  
  333.    Next, the timeout is adjusted: if no responses were received, then
  334.    the timeout is doubled; otherwise, a timeout-adjustment is calculated
  335.  
  336.  
  337.  
  338. Rose, McCloghrie & Davin                                        [Page 6]
  339.  
  340. RFC 1187           Bulk Table Retrieval with the SNMP       October 1990
  341.  
  342.  
  343.    as 1.5 times the largest observed round-trip time.  If the timeout-
  344.    adjustment is greater than the current timeout, the current timeout
  345.    is set to the timeout-adjustment.  Otherwise, the current timeout is
  346.    averaged with the timeout-adjustment.
  347.  
  348.    Finally, if at least one thread did not receive a response, then the
  349.    thread is identified which has waited the longest.  If the elapsed
  350.    time (with noise factor) since the last request (or retransmission)
  351.    is greater than the current timeout value, another retransmission is
  352.    attempted.
  353.  
  354.    wait for events ()
  355.    {
  356.        backoff ::= TRUE, maxrtt ::= 0;
  357.        find the thread which has been waiting the longest
  358.            for a response;
  359.        timedelta = timeout
  360.                        - time since request was sent for thread;
  361.        wait up to timedelta seconds or until some messages arrive;
  362.  
  363.        if (least one message arrived) {
  364.            discard any messages which aren't responses;
  365.            foreach (response which corresponds to a thread) {
  366.                if (the response is a duplicate)
  367.                    drop it and continue;
  368.  
  369.                if (this response is for a message that was
  370.                        not retransmitted) {
  371.                   if (the round-trip time is larger than maxrtt)
  372.                        set maxrtt to the new round-trip time;
  373.                    if (round-trip time / number of active threads
  374.                          < minimum previous round-trip time / number
  375.                               of active threads) {
  376.                        set new minimum round-trip time per number of
  377.                            active threads
  378.                        set new maximum number of threads
  379.                   }
  380.                    backoff ::= FALSE;
  381.                }
  382.            }
  383.        }
  384.        if (backoff)
  385.            double timeout;
  386.        elsif (maxrtt > 0) {
  387.           timeadjust ::= maxrtt * 3 / 2;
  388.            if (timeadjust > timeout)
  389.                timeout ::= timeadjust; backoff ::= TRUE;
  390.            else
  391.  
  392.  
  393.  
  394. Rose, McCloghrie & Davin                                        [Page 7]
  395.  
  396. RFC 1187           Bulk Table Retrieval with the SNMP       October 1990
  397.  
  398.  
  399.                timeout ::= (timeout + timeadjust) / 2;
  400.        }
  401.        if (timeout exceeds some threshold)
  402.           set timeout to that threshold;
  403.       elsif (timeout is smaller than some threshold)
  404.            set timeout to that threshold;
  405.  
  406.        if (at least one thread didn't receive a response) {
  407.            find the thread which has been waiting the longest
  408.                for a response,
  409.                and determine the elapsed time since a message
  410.                was sent;
  411.            if (the elapsed time with noise is greater than timeout) {
  412.                if (the number of retransmissions for this thread
  413.                        exceeds a threshold)
  414.                    abort the algorithm;
  415.                retransmit the request;
  416.                backoff ::= TRUE;
  417.            }
  418.        }
  419.   }
  420.  
  421. 4.6.  Finding the Median between two OIDs
  422.  
  423.    The object identifier space is neither uniform nor continuous.  As
  424.    such, it is not always possible to choose an object identifier which
  425.    is lexicographically-between two arbitrary object identifiers.  In
  426.    view of this, the pipelined algorithm makes a best-effort attempt.
  427.  
  428.    Starting from the beginning, each sub-identifier of the two OIDs is
  429.    scanned until a difference is encountered.  At this point there are
  430.    several possible conditions:
  431.  
  432.       (1)  The upper OID has run out of sub-identifiers.  In this
  433.            case, either the two OIDs are are identical or the lower
  434.            OID is greater than the upper OID (an interface error),
  435.            so no OID is returned.
  436.  
  437.       (2)  The lower OID has run out of sub-identifiers.  In this
  438.            case, the first subsequent non-zero sub-identifier from
  439.            the upper OID is located.  If no such sub-identifier is
  440.            found, then no OID exists between the lower and upper
  441.            OIDs, and no OID is returned.  Otherwise, a copy of the
  442.            upper OID is made, but truncated at this non-zero
  443.            sub-identifier, which is subsequently halved, and the
  444.            resulting OID is returned.
  445.  
  446.       (3)  Otherwise, a copy of the lower OID is made, but truncated
  447.  
  448.  
  449.  
  450. Rose, McCloghrie & Davin                                        [Page 8]
  451.  
  452. RFC 1187           Bulk Table Retrieval with the SNMP       October 1990
  453.  
  454.  
  455.            at the point of difference.  This last sub-identifier is
  456.            then set to the arithmetic mean of the difference.  In
  457.            the case where the difference is only 1 (so the last
  458.            sub-identifier remains the same) then a new sub-
  459.            identifier is added, taking care to be larger than a
  460.            possible sub-identifier present in the lower OID.
  461.            Regardless, the resulting OID is returned.
  462.  
  463.        oid_median (lower, upper)
  464.        OID     lower,
  465.                upper;
  466.        {
  467.            for (i ::= 1; i < upper:nelem; i++) {
  468.                if (i > lower:nelem) {
  469.                    while (upper:elems[i] == 0)
  470.                        if (++i > upper:nelem)
  471.                            return NULL;
  472.                    median ::= copy of upper;
  473.                    median:nelem ::= i;
  474.                    median:elems[i] ::= upper:elems[i] / 2;
  475.  
  476.                    return median;
  477.               }
  478.  
  479.               if (lower:elems[i] == upper:elems[i])
  480.                   continue;
  481.  
  482.                median ::= copy of lower;
  483.                median:nelem ::= i;
  484.                median:elems[i] ::= (lower:elems[i]+upper:elems[i])/2;
  485.                if (median:elems[i] == lower:elems[i]) {
  486.                    median:nelem ::= (i + 1);
  487.                   if (lower:nelem < i)
  488.                       median:elems[median:nelem] ::= 127;
  489.                    elsif ((x ::= lower:elems[i + 1]) >= 16383)
  490.                       median:elems[median:nelem] ::= x + 16383;
  491.                    elsif (x >= 4095)
  492.                       median:elems[median:nelem] ::= x + 4095;
  493.                    elsif (x >= 1023)
  494.                        median:elems[median:nelem] ::= x + 1023;
  495.                    elsif (x >= 255)
  496.                        median:elems[median:nelem] ::= x + 255;
  497.                    else median:elems[median:nelem] ::=
  498.                                                 (x / 2) + 128;
  499.                }
  500.  
  501.                 return median;
  502.            }
  503.  
  504.  
  505.  
  506. Rose, McCloghrie & Davin                                        [Page 9]
  507.  
  508. RFC 1187           Bulk Table Retrieval with the SNMP       October 1990
  509.  
  510.  
  511.            return NULL;
  512.        }
  513.  
  514. 4.7.  Experience with the Pipelined Algorithm
  515.  
  516.    This pipelined algorithm has been implemented and some
  517.    experimentation has been performed.  It would be premature to provide
  518.    extensive performance figures at this time, as the pipelined
  519.    algorithm is still being tuned, and is implemented only in a
  520.    prototype setting.  However, on tables of size O(2500), performance
  521.    of 121 entries/second has been observed.  In contrast, the serial
  522.    algorithm has performance of roughly 56 entries/second for the same
  523.    table.
  524.  
  525. 4.8.  Dynamic Range of Timeout Values
  526.  
  527.    It should be noted that the pipelined algorithm takes a simplistic
  528.    approach with the timeout value: it does not maintain a history of
  529.    the value and act accordingly.
  530.  
  531.    For example, if the timeout reaches the maximum timeout limit, and
  532.    then latches for some period of time, this indicates a resource
  533.    (either the network or the agent) is saturated.  Unfortunately, a
  534.    solution is difficult: an elegant approach would be to combine two
  535.    threads (but it is quite possible that no two consecutive threads
  536.    exist when this determination is made).  Another approach might be to
  537.    delay the transmission for threads which are ready to issue a new
  538.    get-next operation.
  539.  
  540.    Similarly, if the timeout drops to the minimum value and subsequently
  541.    latches, more threads should be started.
  542.  
  543. 4.9.  Incorrect Agent Implementations
  544.  
  545.    An interesting result is that many agents do not properly implement
  546.    the powerful get-next operator.  In particular, when a get-next
  547.    request contains an operand with an arbitrarily-generated suffix,
  548.    some agent implementations will handle this improperly, and
  549.    ultimately return a result which is lexicographically less than the
  550.    operand!
  551.  
  552.    A typical cause of this is when the instance-identifier for a
  553.    columnar object is formed by a MAC or IP address, so each octet of
  554.    the address forms a sub-identifier of the instance-identifier.  In
  555.    such circumstances, the incorrect agent implementations compare
  556.    against only the least significant octet of the sub-identifiers in
  557.    the operand, instead of the full value of the sub-identifiers.
  558.  
  559.  
  560.  
  561.  
  562. Rose, McCloghrie & Davin                                       [Page 10]
  563.  
  564. RFC 1187           Bulk Table Retrieval with the SNMP       October 1990
  565.  
  566.  
  567.    Upon encountering such an interaction, the pipelined algorithm
  568.    implementation declares the thread dead (noting a possible gap in the
  569.    table), and continues.
  570.  
  571. 5.  The Parallel Algorithm
  572.  
  573.    One interesting optimization is to view the problem in two steps: in
  574.    the first step, one column of the table is traversed to determine the
  575.    full range of instances identifiers meaningful in the table.
  576.    (Indeed, although as described above, the pipelined algorithm
  577.    retrieves a single column, the prototype implementation can retrieve
  578.    multiple columns).  In the second step, additional columns can be
  579.    retrieved using the SNMP get operation, since the instance
  580.    identifiers are already known.  Further, the manager can dynamically
  581.    determine how many variables can be placed in a single SNMP get
  582.    operation in order to minimize the number of requests.  Of course,
  583.    since the agent's execution of the get operation is often less
  584.    expensive than execution of the powerful get-next operation, when
  585.    multiple columns are request, this two-step process requires less
  586.    execution time on the agent.
  587.  
  588.    A second algorithm can be developed, the "parallel algorithm".  At
  589.    present, each thread is mapped onto a single SNMP operation.  A
  590.    powerful insight is to suggest mapping several threads onto a single
  591.    SNMP operation: the manager must dynamically determine how many
  592.    variables can be placed in a single powerful get-next operation.
  593.    This has the advantage of reducing traffic, at the expense of
  594.    requiring the agent to utilize more resources for each request.
  595.  
  596.    Earlier it was noted that the serial retrieval of objects could be
  597.    viewed as a degenerate case of the pipelined algorithm, in which the
  598.    number of active threads was one.  Similarly, the pipelined algorithm
  599.    is a special case of the parallel algorithm, in which the number of
  600.    threads per SNMP operation is one.
  601.  
  602. 5.1.  Experience with the Parallel Algorithm
  603.  
  604.    The parallel algorithm has been implemented and some experimentation
  605.    has been performed.  It would be premature to provide extensive
  606.    performance figures at this time, as the algorithm is still being
  607.    tuned, and is implemented only in a prototype setting.  However, on
  608.    tables of size O(2500), performance of 320 entries/second has been
  609.    observed, a performance improvement of 571% over the serial
  610.    algorithm.
  611.  
  612. 6.  Acknowledgements
  613.  
  614.    A lot of the ideas on pipelining are motivated by Van Jacobson's work
  615.  
  616.  
  617.  
  618. Rose, McCloghrie & Davin                                       [Page 11]
  619.  
  620. RFC 1187           Bulk Table Retrieval with the SNMP       October 1990
  621.  
  622.  
  623.    on adaptive timers in TCP.  The parallelization modifications were
  624.    originally suggested by Jeffrey D. Case.
  625.  
  626.    Finally, the comments of the following individual is acknowledged:
  627.  
  628.       Frank Kastenholz, Racal-Interlan
  629.  
  630. 7.  References
  631.  
  632.    [1] Case, J., Fedor, M., Schoffstall, M., and J. Davin, Simple
  633.        Network Management Protocol (SNMP), RFC 1157, SNMP Research,
  634.        Performance Systems International, Performance Systems
  635.        International, MIT Laboratory for Computer Science, May 1990.
  636.  
  637. Security Considerations
  638.  
  639.    Security issues are not discussed in this memo.
  640.  
  641. Authors' Addresses
  642.  
  643.    Marshall T. Rose
  644.    PSI, Inc.
  645.    PSI California Office
  646.    P.O. Box 391776
  647.    Mountain View, CA 94039
  648.  
  649.    Phone: (415) 961-3380
  650.    EMail: mrose@PSI.COM
  651.  
  652.  
  653.    Keith McCloghrie
  654.    Hughes LAN Systems
  655.    1225 Charleston Road
  656.    Mountain View, CA 94043
  657.  
  658.    Phone: (415) 966-7934
  659.    EMail: KZM@HLS.COM
  660.  
  661.  
  662.    James R. Davin
  663.    MIT Laboratory for Computer Science, NE43-507
  664.    545 Technology Square
  665.    Cambridge, MA 02139
  666.  
  667.    Phone:  (617) 253-6020
  668.    EMail:  jrd@ptt.lcs.mit.edu
  669.  
  670.  
  671.  
  672.  
  673.  
  674. Rose, McCloghrie & Davin                                       [Page 12]
  675.